package com.zh.demolock.demo;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class practicelock {
    public static void main(String[] args) throws Exception {
        wallet w = new wallet();
        //重复五次消费，查看每次钱包剩余是否为0
        for (int n = 0; n < 5; n++) {
            //定义100个消费渠道（100个线程）
            for (int i = 0; i < 100; i++)
            {
                new Thread(() -> {
                    //每个线程中消费100次，每次消费1。
                    //预期结果将10000消费完，100*100=10000
                    for (int j = 0; j < 100; j++) {
                        w.pay();
                    }
                }).start();
            }
            Thread.sleep(5000);
            w.balance();
            w.revert();
        }
    }
}

class wallet {
    private int money = 10000;
    //定义锁：
    Lock lock = new ReentrantLock();//多态  接口=实现类  可以使用不同的实现类

    //消费 1
//    public synchronized void pay(){
//        if (money > 0){
//            money--;
//        }
//    }
//    public void pay(){
//        if (money > 0){
//            synchronized (this){
//                money--;
//            }
//        }
//    }
    public void pay(){
        if (money > 0){
            //加锁
            lock.lock();
            try {
                money--;
            }finally {
                //解锁（释放锁）
                lock.unlock();
            }
        }
    }

    //查询余额
    public int balance(){
        System.out.println("钱包还剩：" + money);
        return money;
    }

    //重置金额
    public void revert(){
        money = 10000;
    }
}
